xm: xen-api, pass-through: Dont pass empty opts
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 4 Jun 2009 09:39:03 +0000 (10:39 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 4 Jun 2009 09:39:03 +0000 (10:39 +0100)
Internally xend doesn't know how to handle empty opts.
This code ensures that opts is only included in the sxpr
if its value will be non-empty.

Signed-off-by: Simon Horman <horms@verge.net.au>
tools/python/xen/util/pci.py
tools/python/xen/xend/XendDomainInfo.py

index 7f11d6bbb80ce14a7c24fda7225b6c91379dd5c9..2af8b18c5a4a8691ea6ed369e7f6e2584e75fecc 100644 (file)
@@ -120,6 +120,9 @@ def serialise_pci_opts(opts):
 def split_pci_opts(opts):
     return map(lambda x: x.split('='), opts.split(','))
 
+def pci_opts_list_to_spx(list):
+    ['dev'] + map(lambda x: ['opts', x], list)
+
 def parse_hex(val):
     try:
         if isinstance(val, types.StringTypes):
index b1befd72677e124615fe8869de830b25a9b1cf08..25447798406d3be608b12a62a2b9b2fe83c186e8 100644 (file)
@@ -39,7 +39,7 @@ from xen.util import asserts, auxbin
 from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype
 import xen.util.xsm.xsm as security
 from xen.util import xsconstants
-from xen.util.pci import serialise_pci_opts
+from xen.util.pci import serialise_pci_opts, pci_opts_list_to_spx
 
 from xen.xend import balloon, sxp, uuid, image, arch
 from xen.xend import XendOptions, XendNode, XendConfig
@@ -3771,23 +3771,21 @@ class XendDomainInfo:
         opts_dict = xenapi_pci.get('options')
         for k in opts_dict.keys():
             dpci_opts.append([k, opts_dict[k]])
+        opts_sxp = pci_opts_list_to_spx(dpci_opts)
 
         # Convert xenapi to sxp
         ppci = XendAPIStore.get(xenapi_pci.get('PPCI'), 'PPCI')
 
-        target_pci_sxp = \
-            ['pci', 
-                ['dev',
-                    ['domain', '0x%02x' % ppci.get_domain()],
-                    ['bus', '0x%02x' % ppci.get_bus()],
-                    ['slot', '0x%02x' % ppci.get_slot()],
-                    ['func', '0x%1x' % ppci.get_func()],
-                    ['vslot', '0x%02x' % xenapi_pci.get('hotplug_slot')],
-                    ['opts', dpci_opts],
-                    ['uuid', dpci_uuid]
-                ],
-                ['state', 'Initialising']
-            ]
+        dev_sxp = ['dev',
+                   ['domain', '0x%02x' % ppci.get_domain()],
+                   ['bus', '0x%02x' % ppci.get_bus()],
+                   ['slot', '0x%02x' % ppci.get_slot()],
+                   ['func', '0x%1x' % ppci.get_func()],
+                   ['vslot', '0x%02x' % xenapi_pci.get('hotplug_slot')],
+                   ['uuid', dpci_uuid]]
+        dev_sxp = sxp.merge(dev_sxp, opts_sxp)
+
+        target_pci_sxp = ['pci', dev_sxp, ['state', 'Initialising'] ]
 
         if self._stateGet() != XEN_API_VM_POWER_STATE_RUNNING: